﻿using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public class TechnicRequestsExt
    {
        public TechnicRequestsExt()
        {
            Request = new TechnicRequests();
            ProdustSystemsList = new List<ProductSystems>();
            AttachmentsList = new List<TechnicRequestAttachments>();
            EquipmentsList = new List<Equipments>();
            RequestsEquipmentsList = new List<TechnicRequestsEquipments>();
        }

        public int IdLegalEntity { get; set; }
        public int IdContact { get; set; }
        public int IdAddress { get; set; }
        public int Key { get; set; }
        public string VisitsTypes { get; set; }

        public TechnicRequests Request { get; set; }

        public List<ProductSystems> ProdustSystemsList { get; set; }
        public List<TechnicRequestAttachments> AttachmentsList { get; set; }
        public List<Equipments> EquipmentsList { get; set; }
        public List<TechnicRequestsEquipments> RequestsEquipmentsList { get; set; }

        //конструктор

        /// <summary>
        /// заполнение расширенной заявки из обычной для использование в формах редактирования
        /// </summary>
        /// <param name="technicRequest"></param>
        public void Fill(TechnicRequests technicRequest)
        {
            //заполнение основных свойств
            IdAddress = technicRequest.IdAddress;
            IdContact = technicRequest.IdContact;
            IdLegalEntity = technicRequest.IdLegalEntity;
            VisitsTypes = technicRequest.VisitsTypesString;

            //заполнение свойств заявки
            Request.IdAddress = technicRequest.IdAddress;
            Request.IdContact = technicRequest.IdContact;
            Request.IdCustomer = technicRequest.IdCustomer;
            Request.IdLegalEntity = technicRequest.IdLegalEntity;
            Request.IdTechnicRequest = technicRequest.IdTechnicRequest;
            Request.IdTechnicRequestStatus = technicRequest.IdTechnicRequestStatus;
            Request.IdTechnic = technicRequest.IdTechnic;
            //if (Request.IdTechnic < 1)
            //{
            //    Request.IdTechnic = 581;
            //    //var col = new UsersCollection();
            //    //List<Users> usersList = col.GetUsersByIdRoleType(3);
            //    //if (usersList.Count > 0)
            //    //    Request.IdTechnic = usersList.First().IdUser;
            //}
            Request.Duration = 1;
            Request.PlannedDate = technicRequest.PlannedDate;
            Request.BeginDate = technicRequest.BeginDate;
            Request.EndDate = technicRequest.EndDate;
            Request.CreateDate = technicRequest.CreateDate;
            Request.Comments = technicRequest.Comments;

            //заполнение листа систем
            var productSystemsCol = new ProductSystemsCollection();
            ProdustSystemsList = productSystemsCol.GetProductSystemsListByRequestId(technicRequest.IdTechnicRequest);

            //заполнение списка оборудования
            var equipmentsCol = new EquipmentsCollection();
            EquipmentsList = equipmentsCol.GetEquipmentsListByRequestId(technicRequest.IdTechnicRequest);

            //заполнение списка бпривязок оборудования
            RequestsEquipmentsList = equipmentsCol.GetBindingsEquipmentsListByRequestId(technicRequest.IdTechnicRequest);
        }

        /// <summary>
        /// содержит ли список привязок ИД с обоорудованием?
        /// </summary>
        /// <param name="binding"></param>
        /// <returns></returns>
        public bool Contains(TechnicRequestsEquipments binding)
        {
            foreach (TechnicRequestsEquipments item in RequestsEquipmentsList)
            {
                if (item.IdEquipment == binding.IdEquipment)
                    return true;
            }
            return false;
        }

        /// <summary>
        /// удаляет элемент списка, в котором совпадает ИД оборудования
        /// </summary>
        /// <param name="item"></param>
        public void DeleteEquipment(TechnicRequestsEquipments item)
        {
            if (item == null) return;
            if (RequestsEquipmentsList.Count == 0) return;
            foreach (TechnicRequestsEquipments bindingItem in RequestsEquipmentsList)
            {
                if (bindingItem.IdEquipment != item.IdEquipment) continue;
                RequestsEquipmentsList.Remove(bindingItem);
                break;
            }
        }

        /// <summary>
        /// заполнение измененной результирующей заяки (редактирование)
        /// </summary>
        /// <param name="newRequest"></param>
        public void FillForResult(TechnicRequestsExt newRequest)
        {
            //заполнение из свойств расширенной заявки 
            Request.IdAddress = newRequest.IdAddress;
            Request.IdContact = newRequest.IdContact;
            Request.IdLegalEntity = newRequest.IdLegalEntity;

            //строка с типами выездов
            VisitsTypes = newRequest.VisitsTypes;
            if (string.IsNullOrEmpty(VisitsTypes))
            {
                var visitsTypesCol = new VisitsTypesCollection();
                VisitsTypes = visitsTypesCol.VisitsTypesActiveList.First().VisitsType;
            }

            //заполнение свойств из обычной заявки))
            Request.IdCustomer = newRequest.Request.IdCustomer;
            Request.IdTechnic = newRequest.Request.IdTechnic;
            Request.IdTechnicRequestStatus = newRequest.Request.IdTechnicRequestStatus;
            Request.BeginDate = newRequest.Request.BeginDate;
            Request.EndDate = newRequest.Request.EndDate;
            Request.CreateDate = newRequest.Request.CreateDate;
            Request.PlannedDate = newRequest.Request.PlannedDate;
            Request.Comments = newRequest.Request.Comments;
            Request.Duration = newRequest.Request.Duration;

            //определение статуса "новая" -> "зарегистрирована"
            if (Request.IdTechnic > 0 && Request.IdTechnicRequestStatus < 2)
                Request.IdTechnicRequestStatus = 2;
            if (Request.IdTechnic == 0 && Request.IdTechnicRequestStatus < 2)
                Request.IdTechnicRequestStatus = 1;
        }

        /// <summary>
        /// Сохранение новой расширенной заявки в базу
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public bool Add(string user)
        {
            //сохранение новой заявки в БД
            if (Request == null) return false;
            var requestsCol = new TechnicRequestsCollection();
            Request.Fill();
            if (!requestsCol.Add(Request, user)) return false;
            if (Request.IdTechnicRequest < 1) return false;

            //получение списка типов выездов из текстовой стоки
            var visitsTypesCol = new VisitsTypesCollection();
            List<VisitsTypes> visitsTypesList = visitsTypesCol.GetVisitTypesFromString(VisitsTypes);

            //добавление списка типов выездов заявке
            if (!Request.AddVisitsTypes(visitsTypesList, user)) return false;

            //добавление систем к заявке
            if (!Request.AddProductSystems(ProdustSystemsList, user)) return false;

            //добавление аттачментов к заявке
            if (!Request.AddAttachments(AttachmentsList, user)) return false;

            //Добавление оборудования 
            if (!Request.AddEquipments(RequestsEquipmentsList, user)) return false;

            return true;
        }

        /// <summary>
        /// Обновление расширенной заявки в базе
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public bool Update(string user)
        {
            //Обновление заявки в БД
            if (Request == null) return false;
            var requestsCol = new TechnicRequestsCollection();
            Request.Fill();
            if (!requestsCol.Update(Request, user)) return false;

            //получение списка типов выездов из текстовой стоки
            var visitsTypesCol = new VisitsTypesCollection();
            List<VisitsTypes> visitsTypesList = visitsTypesCol.GetVisitTypesFromString(VisitsTypes);

            //обновление списка типов выездов заявке
            if (visitsTypesList.Count > 0)
                if (!Request.UpdateVisitsTypes(visitsTypesList, user)) return false;

            //Обновление списка систем
            if (!Request.UpdateProductSystems(ProdustSystemsList, user)) return false;

            //Обновление оборудования
            if (!Request.UpdateEquipments(RequestsEquipmentsList, user)) return false;

            //добавление аттачментов к заявке, если есть 
            if (AttachmentsList.Count > 0)
                return Request.AddAttachments(AttachmentsList, user);
            return true;
        }

        /// <summary>
        /// Заполнить список оборудования оборудованием клиента
        /// </summary>
        /// <returns></returns>
        public bool FillEquipmentsListFromCustomer()
        {
            //получить клиента 
            if (Request.IdCustomer < 1) return false;
            //if (Request.IdTechnicRequest < 1) return false;
            var customersCol = new CustomersCollection();
            var customer = (Customers) customersCol.GetItemById(Request.IdCustomer);
            if (customer == null) return false;

            //получить список привязок оборудования к клиенту
            if (customer.CustomersEquipments == null) return true;
            List<CustomersEquipments> bindingList = customer.CustomersEquipments.ToList();

            //заполнить список привязок обородования к заявке
            var equipmentsCol = new EquipmentsCollection();
            foreach (CustomersEquipments bindingItem in bindingList)
            {
                var equipment = (Equipments) equipmentsCol.GetItemById(bindingItem.IdEquipment);
                if (equipment != null)
                    EquipmentsList.Add(equipment);
                var item = new TechnicRequestsEquipments
                               {
                                   IdTechnicRequest = Request.IdTechnicRequest,
                                   IdEquipment = bindingItem.IdEquipment,
                                   IssueDate = bindingItem.IssueDate,
                                   EquipmentCount = bindingItem.EquipmentCount
                               };
                RequestsEquipmentsList.Add(item);
            }
            return true;
        }
    }
}